package com.aurora.leetcode.answer;

import java.util.Arrays;
import java.util.Collections;

/**
 * @author : Aurora
 * @date : 2024/5/24 17:55
 * @description
 * <p>151. 反转字符串中的单词</p>
 * <p>给你一个字符串 s ，请你反转字符串中 单词 的顺序。</p>
 * <p>单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。</p>
 * <p>返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。</p>
 * <p>注意：输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中，单词间应当仅用单个空格分隔，且不包含任何额外的空格。</p>
 * <p>示例 1：</p>
 * <p>输入：s = "the sky is blue"</p>
 * <p>输出："blue is sky the"</p>
 * <p>示例 2：</p>
 * <p>输入：s = "  hello world  "</p>
 * <p>输出："world hello"</p>
 * <p>解释：反转后的字符串中不能存在前导空格和尾随空格。</p>
 * <p> 示例 3：</p>
 * <p>输入：s = "a good   example"</p>
 * <p> 输出："example good a"</p>
 * <p> 解释：如果两个单词间有多余的空格，反转后的字符串需要将单词间的空格减少到仅有一个。</p>
 */
public class ReverseWords_151 {
    //方法一：双指针
    public String reverseWords(String s) {
        StringBuilder result = new StringBuilder();
        int left = s.length()-1, right = left;
        boolean hasWord = false;
        while(left >=0){
            char c = s.charAt(left);
            //遇到非字母且left->right间已经含有单词
            if((c == 32 && hasWord)){
                int temp = left+1;
                //添加单词
                while(temp <= right){
                    result.append(s.charAt(temp));
                    temp++;
                }
                result.append(' ');
                hasWord = false;
            }else if(c != 32 && !hasWord){
                right = left;
                hasWord = true;
            }
            left --;
        }
        if(hasWord){
            for(int i=0; i<=right; ++i){
                result.append(s.charAt(i));
            }
        }
        if(result.charAt(result.length()-1)==' '){
            return result.substring(0,result.length()-1);
        }
        return result.toString();
    }


    //方法二：api
    public String reverseWords2(String s){
        String trim = s.trim();
        String[] s1 = trim.split("\\s+");
        Collections.reverse(Arrays.asList(s1));
        return String.join(" ", s1);
    }

    public static void main(String[] args) {
//        ReverseWords_151 obj = new ReverseWords_151();
//    System.out.println(obj.reverseWords("b cc"));
        System.out.println((int)' ');
    }
}
